#include "operacionIngresar.h"

std::string OperacionIngresar::NOMBRE_PARAM_INGRESAR = "INGRESAR";	

OperacionIngresar::OperacionIngresar(const std::string &nombre_arch, const std::string &datos_sec){
	this->nombre_archivo = nombre_arch;
	this->datos_sec = datos_sec;
}

Operacion * OperacionIngresar::construir(std::string param){
	Operacion * _return = NULL;
	//Me fijo si la operacion efectuada es ingresar
	if (Parser::procesar_nombre_operacion(param,NOMBRE_PARAM_INGRESAR)){
		//Hago un split de los parametros del ingresar, me fijo si son 2
		std::vector<std::string> params = Parser::split_parametros(param, ';');
		if( params.size() == 2){
			//El primer param es el nombre del archivo entre ''. Valido que sea correcto.
			std::string nombre_archivo;
			nombre_archivo = Parser::procesar_nombre(params[0]);//reviso el nombre del archivo
			//Params[1] es la expresion con los datos secundarios a ingresar.
			//Params[0] tiene el nombre del archivo sin ' '
			//Creo la operacion ingresar.
			return new OperacionIngresar(nombre_archivo, params[1]);
			
		}
	}
	return _return;
}
	
void OperacionIngresar::ejecutar(Modelo *modelo){
	
	std::string msg;
	TipoStruct* reg = NULL;
	
	try{
		//Obtengo el archivo del modelo y su registro base
		ArchivoDatos* arch = &(modelo->get_archivo(this->nombre_archivo));
		reg = (TipoStruct*) arch->get_registro_base()->clonar();
		
		//Proceso el ingreso con el parser
		Parser::procesar_ingreso(datos_sec, reg);
		
		//Agrego el registro en el archivo	
		arch->ingresar(reg);
		
		//Si se pudo, imprimo un msg que indica que se ingreso el registro
		msg = "Se ingreso en el archivo "+this->nombre_archivo +" el registro " + datos_sec + " . RES = 1";

	}
	catch(ExcepSintaxisParser &e){
		std::string aux = e.what();
		msg = aux + " RES = 0";
	}
	catch(ExcepArchInexistente &e) {
		std::string aux = e.what();
		msg = aux + " RES = 0";
	}
	catch(ExcepRegExistente &e) {
		std::string aux = e.what();
		msg = aux + "RES = 0";	
	
	}
	catch(ExcepBloqueTam &e){
		std::string aux = e.what();
		msg = aux + "RES = 0";	
	}
	if (reg != NULL)
		delete(reg);
	imprimir_msg(msg);
}

void OperacionIngresar::imprimir_msg(std::string msg){
		(*Logger::get_instance()) << msg;
		(Debug::get_instance() )->mostrar_mensaje(msg);
}
